home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / dossubi.asm < prev    next >
Assembly Source File  |  1985-06-03  |  4KB  |  149 lines

  1.  
  2. ; DOSSUBI - general dos subroutine interface for interpretive BASIC
  3. ; CALL DOSSUBI(STACK$,RETCD%,INTNO%,AH%,AL%,BH%,BL%,CH%,CL%,DH%,DL%)
  4. ; STACK$ is the stack area
  5. ; RETCD% is the error return code (0 if no error)
  6. ; INTNO% is the interrupt number (0 to 255)
  7. ; AH% is the argument corresponding to register AH
  8. ; AL% is the argument corresponding to register AL
  9. ; BH% is the argument corresponding to register BH
  10. ; BL% is the argument corresponding to register BL
  11. ; CH% is the argument corresponding to register CH
  12. ; CL% is the argument corresponding to register CL
  13. ; DH% is the argument corresponding to register DH
  14. ; DL% is the argument corresponding to register DL
  15. cseg segment para public 'code'
  16. public dossubi
  17. dossubi proc far
  18.     assume cs:cseg,ds:nothing,ss:nothing,es:nothing
  19.     push bp
  20.     mov bp,sp
  21.  
  22. p10:               ; use passed stack
  23.     mov di,sp      ; save orig sp
  24.     mov si,[bp+26] ; point to stack$ arg
  25.     mov al,[si]    ; get length
  26.     mov ah,0
  27.     inc si
  28.     add ax,[si]    ; add start addr
  29.     dec ax         ; down by 1
  30.     mov sp,ax      ; new sp
  31.     push di        ; save orig sp on new stack
  32.  
  33. p20:               ; temporarily change fatal error vector
  34.     mov ax,0
  35.     mov ds,ax
  36.     mov ax,[ds:90h]; get fatal error ip
  37.     push ax        ; save ip
  38.     mov ax,[ds:92h]; get fatal error cs
  39.     push ax        ; save cs
  40.     call p25       ; get ip
  41. p25:
  42. a25 equ this byte
  43.     pop bx         ; ip in bx
  44.     add bx,a50-a25
  45.     mov ds:90h,bx  ; ip of vector
  46.     push cs        ; set fatal error cs
  47.     pop ax         ; set ds to cs
  48.     mov ds:92h,ax  ; cs of vector
  49.     mov ax,es
  50.     mov ds,ax      ; restore ds
  51.  
  52. p30:               ; set registers for call
  53.     mov si,[bp+20] ; point to ah argument
  54.     mov ah,[si]
  55.     mov si,[bp+18] ; point to al argument
  56.     mov al,[si]
  57.     mov si,[bp+16] ; point to bh argument
  58.     mov bh,[si]
  59.     mov si,[bp+14] ; point to bl argument
  60.     mov bl,[si]
  61.     mov si,[bp+12] ; point to ch argument
  62.     mov ch,[si]
  63.     mov si,[bp+10] ; point to cl argument
  64.     mov cl,[si]
  65.     mov si,[bp+8]  ; point to dh argument
  66.     mov dh,[si]
  67.     mov si,[bp+6]  ; point to dl argument
  68.     mov dl,[si]
  69.  
  70. p40:               ; set up for call
  71.     push ax
  72.     push bx
  73.     mov si,[bp+22] ; point to interrupt no
  74.     mov al,[si]    ; interrupt in al
  75.     call p45
  76. p45:
  77. a45 equ this byte
  78.     pop bx         ; ip in bx
  79.     add bx,a46-a45+1
  80.     mov cs:[bx],al ; set interrupt
  81.     pop bx
  82.     pop ax
  83.     push bp        ; save bp - bios bug
  84. a46 equ this byte
  85.     int 00h        ; overlaid by intno%
  86.     jmp p60        ; skip err control
  87.  
  88. p50:               ; handle fatal error
  89. a50 equ this byte
  90.     sti            ; interrupts back on
  91.     mov ax,di      ; get error code
  92.     mov ah,0       ; error in al
  93.     add sp,18      ; skip unneeded stack
  94.     pop bp
  95.     pop ds
  96.     pop es
  97.     add sp,6
  98.     pop bp         ; restore bp - bios bug
  99.     mov si,[bp+24]
  100.     mov [si],ax    ; return error
  101.     jmp p70        ; restore orig vector
  102.  
  103. p60:               ; return register values
  104.     pop bp         ; restore bp - bios bug
  105.     mov si,[bp+20] ; point to ah argument
  106.     mov [si],ah
  107.     mov si,[bp+18] ; point to al argument
  108.     mov [si],al
  109.     mov si,[bp+16] ; point to bh argument
  110.     mov [si],bh
  111.     mov si,[bp+14] ; point to bl argument
  112.     mov [si],bl
  113.     mov si,[bp+12] ; point to ch argument
  114.     mov [si],ch
  115.     mov si,[bp+10] ; point to cl argument
  116.     mov [si],cl
  117.     mov si,[bp+8]  ; point to dh argument
  118.     mov [si],dh
  119.     mov si,[bp+6]  ; point to dl argument
  120.     mov [si],dl
  121.  
  122. p70:               ; reset fatal error vector
  123.     mov ax,0
  124.     mov ds,ax
  125.     pop ax         ; re-set fatal error vector
  126.     mov ds:92h,ax  ; restore original cs
  127.     pop ax
  128.     mov ds:90h,ax  ; restore original ip
  129.     mov ax,es
  130.     mov ds,ax      ; restore ds
  131.  
  132. p80:               ; return to caller
  133.     pop di         ; get orig sp
  134.     mov sp,di      ; back to orig stack
  135.     pop bp         ; return to caller
  136.     ret 22
  137.  
  138. dossubi endp
  139. cseg ends
  140.     end
  141. 
  142.  
  143. ,di      ; back to orig stack
  144.     pop bp         ; return to caller
  145.     ret 22
  146.  
  147. dossubi endp
  148. cseg ends
  149.